<?php /** @noinspection PhpComposerExtensionStubsInspection */

namespace app\common\library;

use Exception;

/**
 * 铁壳场地自定义工具
 * Class TechminoTools
 * @package app\common\library
 */
class TechminoTools
{
    // 不同的块使用1字节表示

    // 0x00 X(禁止)
    // 0x01 空格子(如果整行没有任何格子不需要全填充)
    // 0x02 - 0x09 第一行的彩色格子
    // 0x0A - 0x11 第二行的彩色格子
    // 0x12 骨牌
    // 0x13 ??
    // 0x14 炸弹
    // 0x16 - 0x19 6种颜色的垃圾行

    /**
     * 解码场地字符串
     * @param $field
     * @return array
     * @throws Exception
     */
    public static function decodeField($field): array
    {
        // 导出样例 Techmino Field:eJwTEwMCRhAhAQWMEgARJQGh
        if (preg_match('/^Techmino\sField:([a-zA-Z0-9+\/=)]+)/', $field, $match)) {

            // 将编码字符串解开
            $fieldArr = [];
            $exportStr = $match[1];
            $exportDecoded = zlib_decode(base64_decode($exportStr));

            // 如果解开的字符串不是10字节的整倍数则抛异常
            if (!(strlen($exportDecoded) % 10 === 0)) {
                throw new Exception('Techmino field str length is not a multiple of 10.');
            }

            // 每10个字节是场地的一行
            for ($i = 0; $i < strlen($exportDecoded); $i += 10) {
                $rowData = [];
                $row = substr($exportDecoded, $i, 10);
                for ($j = 0; $j < 10; $j++) {
                    $rowData[] = ord($row[$j]);
                }
                $fieldArr[] = $rowData;
            }

            // 输出场地数组
            return array_reverse($fieldArr);
        }

        throw new Exception('Techmino field str is damaged. ');
    }

    /**
     * 编码场地数组
     * @param $fieldArr
     * @return string
     */
    public static function encodeField($fieldArr): string
    {
        $fieldStr = '';
        $fieldArr = array_reverse($fieldArr);

        // 行列构成字符串
        foreach ($fieldArr as $row) {
            foreach ($row as $cell) {
                $fieldStr .= chr($cell);
            }
        }

        return 'Techmino Field:' . base64_encode(zlib_encode($fieldStr, ZLIB_ENCODING_DEFLATE));
    }
}
